x
patches-own[ strategy indicator]globals[ price abs-price last-price last-price2 P F F2 fit returns str-random ; random rumber for initial strategy selection talks-done ; number of executed talks per tick talker-strategy ; strategy of talking agent talks-per-round alpha ; random term for price and trading decisions beta sigma yota securities securities2 securities3 chart-orders chart-orders2 chart-orders3 fund-orders fund-orders2 fund-orders3 all-orders N NN NN2 NN3 N-save N2-save N-fund N2-fund N-chart N2-chart W-save W-fund W-chart fit-chart2 fit-chart fit-fund2 fit-fund fit-save2 fit-save prob-change-chart-fund prob-change-fund-chart prob-change-chart-save prob-change-save-chart prob-change-fund-save prob-change-save-fund trans-prob-chart-save trans-prob-chart-fund trans-prob-save-chart trans-prob-save-fund trans-prob-fund-save trans-prob-fund-chart trans-prob min-trans-prob save2fund fund2save save-react-param ;Parameters Westerhoff prob_talk_change prob-indep-change memory price-adj-coeff rand-price-flucts rand-chart-shocks rand-deviat-fund chart_react_param fund-react-param shock fit2]to setup clear-all clear-all-plots setup-traders set N sum [indicator] of patches set N-chart sum [indicator] of patches with [strategy = 3] set N-fund sum [indicator] of patches with [strategy = 2] set N-save sum [indicator] of patches with [strategy = 1] set NN (N-chart + N-fund) set NN2 NN set NN3 NN2 set N2-save 0 set N2-fund 0 set N2-chart 0 set min-trans-prob 3 / count patches set talks-per-round (perc-talk / 200) * count patches set F 0 set F2 F set returns 0 set price F set abs-price 0 set last-price F set last-price2 F set P 1 set fit 1 set fit2 1 ; random term for price and trading decisions set securities 0 set securities2 0 set securities3 0 set chart-orders 0 set chart-orders2 0 set chart-orders3 0 set fund-orders 0 set fund-orders2 0 set fund-orders3 0 set all-orders 0 set W-save 0 set W-fund 0 set W-chart 0 set fit-chart2 0 set fit-chart 0 set fit-fund2 0 set fit-fund 0 set fit-save2 0 set fit-save 0 set save2fund True set fund2save True set save-react-param 0.05 ;Parameters Westerhoff set prob_talk_change 0.45 set prob-indep-change 0.1 set memory 0.95 set price-adj-coeff 0.9 set rand-price-flucts 0.005 set rand-chart-shocks 0.075 set rand-deviat-fund 0.085 set chart_react_param 0.06 set fund-react-param 0.01 set shock 0 reset-ticksendto setup-traders ;let total-pop (savers-pop + fundis-pop + chartis-pop) ask patches [ set indicator 1 set str-random (random-float 1.0) ifelse str-random < (1 / 3) [ set strategy 1 set pcolor green] [ ifelse str-random < (2 / 3) [ set strategy 3 set pcolor red] [ set strategy 2 set pcolor blue] ] ]endto go if ticks >= steps [ stop ] if ticks > 2 [talk-and-learn] market-mechanics tickendto positiv-shock if shock = 0 [set shock 1] if shock = -1 [set shock 0]endto negativ-shock if shock = 0 [set shock -1] if shock = 1 [set shock 0]endto market-mechanics calculate-orders calculate-weights price-mechanics calculate-fitness change-probabilityendto talk-and-learn set talks-done 0 while [talks-per-round >= talks-done] [ ask patch random-xcor random-ycor ; select listening agent [ set talker-strategy [strategy] of patch random-xcor random-ycor ; select talking agent with strategy if not (strategy = talker-strategy) [ if talker-strategy = 1 ; Learn Saving [ if strategy = 2 and (fit-save > fit-fund) and (trans-prob-fund-save > min-trans-prob) and (fund2save = True) ; Fundamentalist learns Saving [ set strategy 1 set pcolor green ] if strategy = 3 and (fit-save > fit-chart) and (trans-prob-chart-save > min-trans-prob) ; Chartist learns Saving [ set strategy 1 set pcolor green ] ] if talker-strategy = 2 ; Learn Fundamental Trading [ if strategy = 1 and (fit-fund > fit-save) and (trans-prob-save-fund > min-trans-prob) and (save2fund = True) ; Saver learns Fundamentals [ set strategy 2 set pcolor blue ] if strategy = 3 and (fit-fund > fit-chart) and (trans-prob-chart-fund > min-trans-prob) ; chartist learns fundamentals [ set strategy 2 set pcolor blue ] ] if talker-strategy = 3 ; Learn Chart Trading [ if strategy = 1 and (fit-chart > fit-save) and (trans-prob-save-chart > min-trans-prob) ; Saver learns Charts [ set strategy 3 set pcolor red ] if strategy = 2 and (fit-chart > fit-fund) and (trans-prob-fund-chart > min-trans-prob) ; Fundamentalist learns to follow Charts [ set strategy 3 set pcolor red ] ] ] ] set talks-done talks-done + 1 ]endto calculate-orders ; set random variables set beta random-normal 0 rand-chart-shocks set yota random-normal 0 rand-deviat-fund ; calculate security orders set securities3 securities2 set securities2 securities set securities (save-react-param * return-on-savings) ; calculate chartist orders set chart-orders3 chart-orders2 set chart-orders2 chart-orders set chart-orders (chart_react_param * (price - last-price) + beta) ; calculate fundamental orders set fund-orders3 fund-orders2 set fund-orders2 fund-orders set fund-orders (fund-react-param * (F - price) + yota) set all-orders (abs chart-orders + abs fund-orders)endto calculate-weights set N2-chart N-chart set N2-fund N-fund set N2-save N-save set N-chart sum [indicator] of patches with [strategy = 3] set W-chart (N-chart / N) set N-fund sum [indicator] of patches with [strategy = 2] set W-fund (N-fund / N) set N-save sum [indicator] of patches with [strategy = 1] set W-save (N-save / N) set NN2 NN set NN3 NN2 set NN (N2-chart + N2-fund)endto price-mechanics set alpha random-normal 0 rand-price-flucts ; update price set last-price2 last-price set last-price price set F2 F set F shock set price (last-price + price-adj-coeff * (chart-orders * W-chart + fund-orders * W-fund) + alpha) ;set abs-price (abs price) set fit exp(0.0012) ^ ticks set fit2 fit + fit * shock / 2 set P fit + ( price * fit / 2 ) ifelse last-price = 0 [set returns 0.0] [set returns (price - last-price)]endto calculate-fitness ; calculate fitness of strategie set fit-chart2 fit-chart set fit-fund2 fit-fund set fit-save2 fit-save set fit-chart (((exp price) - (exp last-price)) * chart-orders3 + memory * fit-chart2) set fit-fund (((exp price) - (exp last-price)) * fund-orders3 + memory * fit-fund2) set fit-save ((exp return-on-savings) * securities3 + memory * fit-save2)endto change-probability ; Probability of strategy change if (fit-chart > fit-fund) [ set prob-change-chart-fund 0.5 - prob_talk_change set prob-change-fund-chart 0.5 + prob_talk_change ] if (fit-fund > fit-chart) [ set prob-change-chart-fund 0.5 + prob_talk_change set prob-change-fund-chart 0.5 - prob_talk_change ] if (fit-chart > fit-save) [ set prob-change-chart-save 0.5 - prob_talk_change set prob-change-save-chart 0.5 + prob_talk_change ] if (fit-save > fit-chart) [ set prob-change-chart-save 0.5 + prob_talk_change set prob-change-save-chart 0.5 - prob_talk_change ] if (fit-save > fit-fund) [ set prob-change-fund-save 0.5 + prob_talk_change set prob-change-save-fund 0.5 - prob_talk_change ] if (fit-fund > fit-save) [ set prob-change-fund-save 0.5 - prob_talk_change set prob-change-save-fund 0.5 + prob_talk_change ] set trans-prob-chart-save (W-chart * (prob-indep-change + prob-change-chart-save * W-save)) set trans-prob-chart-fund (W-chart * (prob-indep-change + prob-change-chart-fund * W-fund)) set trans-prob-save-chart (W-save * (prob-indep-change + prob-change-save-chart * W-chart)) set trans-prob-save-fund (W-save * (prob-indep-change + prob-change-save-fund * W-fund)) set trans-prob-fund-save (W-fund * (prob-indep-change + prob-change-fund-save * W-save)) set trans-prob-fund-chart (W-fund * (prob-indep-change + prob-change-fund-chart * W-chart)) set trans-prob ( trans-prob-chart-save + trans-prob-chart-fund + trans-prob-save-chart + trans-prob-save-fund + trans-prob-fund-save + trans-prob-fund-chart )end